package com.whf.android.jar.app;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;

import androidx.annotation.NonNull;

import com.whf.android.jar.constants.AppConstant;
import com.whf.android.jar.constants.HttpConstant;
import com.whf.android.jar.net.HttpCode;
import com.whf.android.jar.net.gson.HttpGsonUtils;
import com.whf.android.jar.util.log.LatteLogger;

import org.jetbrains.annotations.NotNull;

import java.util.Collections;
import java.util.List;

/**
 * @author 傅令杰
 * @version 2.0.5
 */
public final class Latte {

    public static Configurator init(@NotNull Context context) {
        Configurator.getInstance()
                .getLatteConfigs()
                .put(ConfigKeys.APPLICATION_CONTEXT, context.getApplicationContext());
        return Configurator.getInstance();
    }

    /**
     * 获得对象
     *
     * @return Configurator
     */
    public static Configurator getConfigurator() {
        return Configurator.getInstance();
    }

    /**
     * 获得全局对象
     *
     * @param key:key
     * @param <T>:对象
     * @return :对象数据
     */
    public static <T> T getConfiguration(Object key) {
        return getConfigurator().getConfiguration(key);
    }

    /**
     * 获得全局上下文
     */
    public static Application getApplicationContext() {
        return getConfiguration(ConfigKeys.APPLICATION_CONTEXT);
    }

    /**
     * 获得上下文
     */
    public static Activity getActivity() {
        return getConfiguration(ConfigKeys.ACTIVITY);
    }

    /**
     * 项目的ID（app云的）
     */
    public static String getAppId() {
        return getConfiguration(ConfigKeys.APP_ID);
    }

    /**
     * 项目的ID（BugLy的）
     */
    public static String getAppBugId() {
        try {
            return getConfiguration(ConfigKeys.APP_BUG_ID);
        } catch (Exception e) {
            LatteLogger.e(e.getMessage());
        }
        return "";
    }

    /**
     * 不需要切换服务
     */
    public static boolean isSwitchingServices() {
        try {
            return getConfiguration(ConfigKeys.SWITCHING_SERVICES);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 默认不给截屏添加水印
     */
    public static boolean isProhibitScreenshot() {
        try {
            return getConfiguration(ConfigKeys.PROHIBIT_SCREENSHOT);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 默认检查证书(ssl)
     */
    public static boolean isTrustCertificate() {
        try {
            return getConfiguration(ConfigKeys.TRUST_CERTIFICATE);
        } catch (Exception e) {
            return true;
        }
    }

    /**
     * 服务器主机名(ssl)
     */
    public static String getHostname() {
        try {
            return getConfiguration(ConfigKeys.HOSTNAME);
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * 引导时间
     */
    public static int getAppGuide() {
        try {
            return getConfiguration(ConfigKeys.APP_GUIDE);
        } catch (Exception e) {
            return 3;
        }
    }

    /**
     * 是否显示引导时间
     */
    public static boolean isAppGuide() {
        try {
            return getConfiguration(ConfigKeys.APP_IS_GUIDE);
        } catch (Exception e) {
            return true;
        }
    }


    /**
     * 是否显示引导时间
     */
    public static float fontScale() {
        try {
            return getConfiguration(ConfigKeys.APP_FONT_SCALE);
        } catch (Exception e) {
            return 1;
        }
    }

    /**
     * 水印显示内容
     */
    public static List<String> watermark() {
        try {
            return getConfiguration(ConfigKeys.WATERMARK);
        } catch (Exception e) {
            return Collections.singletonList("这是水印");
        }
    }

    /**
     * token
     */
    public static String getToken() {
        try {
            return getConfiguration(ConfigKeys.TOKEN);
        } catch (Exception e) {
            return "Basic cGlnOnBpZw==";
        }
    }

    /**
     * uid
     */
    public static String getUid() {
        try {
            return getConfiguration(ConfigKeys.UID);
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * 桌面图标
     */
    public static int getAppIcon() {
        try {
            return getConfiguration(ConfigKeys.APP_ICON);
        } catch (Exception ex) {
            return com.whf.android.jar.R.drawable.app_core_icon;
        }
    }

    /**
     * 桌面图标
     */
    public static Bitmap getAppLarge() {
        return BitmapFactory.decodeResource(getApplicationContext().getResources(), getAppIcon());
    }

    /**
     * 获得适配
     */
    public static float getAdaptation() {
        try {
            return getConfiguration(ConfigKeys.ADAPTATION);
        } catch (Exception ex) {
            return 360f;
        }
    }

    /**
     * 服务
     */
    public static String getServer() {
        try {
            return getConfiguration(ConfigKeys.API_HOST);
        } catch (Exception ex) {
            return "https://www.baidu.com";
        }
    }

    /**
     * 基础服务的下级域名或二级域名
     * 如：https://www.baidu.com/fanyi 其中 fanyi 就是下级域名
     */
    public static String getField() {
        try {
            return getConfiguration(ConfigKeys.API_FIELD);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * 版本更新服务
     */
    public static String getCheckVersionServer() {
        try {
            return getConfiguration(ConfigKeys.API_CHECK_VERSION);
        } catch (Exception ex) {
            return AppConstant.CHECK_VERSION;
        }
    }

    /**
     * 版本更新记录
     */
    @NonNull
    public static String getCheckHistoryServer() {
        try {
            return getConfiguration(ConfigKeys.API_CHECK_HISTORY) + getAppId();
        } catch (Exception ex) {
            return AppConstant.CHECK_HISTORY + getAppId();
        }
    }

    /**
     * 是否为调试模式
     */
    public static boolean getDebug() {
        try {
            return getConfiguration(ConfigKeys.LOGGABLE);
        } catch (Exception ex) {
            return false;
        }
    }

    /**
     * 是否为灰白界面
     */
    public static boolean getMourning() {
        try {
            return getConfiguration(ConfigKeys.MOURNING);
        } catch (Exception ex) {
            return false;
        }
    }

    /**
     * 是否拦截服务器错误
     * <p>默认不拦截 500到505</p>
     */
    public static boolean getServerError() {
        try {
            return getConfiguration(ConfigKeys.SERVER_ERROR);
        } catch (Exception ex) {
            return false;
        }
    }

    /**
     * 请求成功代号（默认200）
     */
    public static int getCode() {
        try {
            return getConfiguration(ConfigKeys.CODE_SUCCESS);
        } catch (Exception ex) {
            return HttpCode.CODE_200;
        }
    }

    /**
     * 成功信息key（默认code）
     */
    public static String getKeyCode() {
        try {
            return getConfiguration(ConfigKeys.KEY_CODE);
        } catch (Exception ex) {
            return HttpConstant.CODE;
        }
    }

    /**
     * 成功信息代号
     */
    public static int getCode(String response) {
        return HttpGsonUtils.getInt(response, getKeyCode());
    }

    /**
     * 成功信息key（默认data）
     */
    public static String getKeyData() {
        try {
            return getConfiguration(ConfigKeys.KEY_DATA);
        } catch (Exception ex) {
            return HttpConstant.DATA;
        }
    }

    /**
     * 成功信息
     */
    public static String getData(String response) {
        return HttpGsonUtils.getString(response, getKeyData());
    }

    /**
     * 错误信息key（默认message）
     */
    public static String getKeyMessage() {
        try {
            return getConfiguration(ConfigKeys.KEY_MESSAGE);
        } catch (Exception ex) {
            return HttpConstant.MESSAGE;
        }
    }

    /**
     * 错误信息
     */
    public static String getMessage(String response) {
        return HttpGsonUtils.getString(response, getKeyMessage());
    }

    /**
     * 聊天服务器HOST
     */
    public static String geImServer() {
        try {
            return getConfiguration(ConfigKeys.IM_HOST);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * 浏览器HOST
     */
    public static String getWebServer() {
        try {
            return getConfiguration(ConfigKeys.WEB_HOST);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * h5的HOST
     */
    public static String getFrontServer() {
        try {
            return getConfiguration(ConfigKeys.FRONT_HOST);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * 附件服务器
     */
    public static String getFtpServer() {
        try {
            return getConfiguration(ConfigKeys.FTP_HOST);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * bi数仓服务器
     */
    public static String getBiServer() {
        try {
            return getConfiguration(ConfigKeys.BI_HOST);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * 其他服务器
     */
    public static String getOtherServer() {
        try {
            return getConfiguration(ConfigKeys.OTHER_HOST);
        } catch (Exception ex) {
            return "";
        }
    }

    /**
     * 请求是否过期标识
     */
    public static int getSignExpiration() {
        return getConfiguration(ConfigKeys.SIGN_EXPIRATION);
    }

    /**
     * 网络建立连接超时
     */
    public static int getTimeOut() {
        try {
            return getConfiguration(ConfigKeys.NET_TIME_OUT);
        } catch (Exception ex) {
            //默认25秒
            return 25;
        }
    }

    /**
     * 网络请求超时时间
     * <p>整个网络最多使用时间
     */
    public static int getTimeOutCall() {
        try {
            return getConfiguration(ConfigKeys.NET_TIME_OUT_CALL);
        } catch (Exception ex) {
            //默认值为0,代表不考虑请求的超时.
            return 0;
        }
    }

    /**
     * 版本号
     */
    public static int getVersionCode() {
        return getConfiguration(ConfigKeys.VERSION_CODE);
    }

    /**
     * 版本号名称
     */
    public static String getVersionName() {
        return getConfiguration(ConfigKeys.VERSION_NAME);
    }

    /**
     * 上传单文件时表单字段的名称
     */
    public static String getUploadFile() {
        try {
            return getConfiguration(ConfigKeys.UPLOAD_FILE);
        } catch (Exception ex) {
            return "file";
        }
    }

    /**
     * 上传多文件时表单字段的名称
     */
    public static String getUploadFiles() {
        try {
            return getConfiguration(ConfigKeys.UPLOAD_FILES);
        } catch (Exception ex) {
            return "files";
        }
    }

    /**
     * 状态栏高度
     */
    public static int getBarHeight() {
        return getConfiguration(ConfigKeys.BAR_HEIGHT);
    }

    public static Handler getHandler() {
        return getConfiguration(ConfigKeys.HANDLER);
    }

    public static void test() {

    }
}